package com.pp.web.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.pp.common.pojo.Follow;
import com.pp.common.pojo.User;
import com.pp.common.vo.SysResult;
import com.pp.web.service.IFollowService;
import com.pp.web.service.IUserService;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import java.util.HashMap;
import java.util.Map;

import static com.pp.common.util.JwtUtils.USERNAME;

@RestController
@RequestMapping("/api/relationship")
public class RelationshipController extends BaseController {

    @Resource
    private IUserService userService;

    @Resource
    private IFollowService followService;

    /**
     * 关注
     * 请求方法: GET
     * 请求URL: http://localhost:8090/api/relationship/subscribe/authorId
     * 请求参数: authorId 被关注人 ID
     * 返回值: SysResult("已关注 / 关注成功")
     */
    @GetMapping("/subscribe/{authorId}")
    public SysResult follow(
        @RequestHeader(value = USERNAME) String username,
        @PathVariable("authorId") String authorId) {
        // 根据 JWT 中的 username 获取对应的登录用户信息
        User follower = userService.getUserByUsername(username);

        // 当前登录用户不能关注自己
        if (authorId.equals(follower.getId())) {
            return SysResult.fail("您脸皮太厚了，怎么可以关注自己呢 😮");
        }

        // 从 follow 关注表中查询当前登录用户是否已关注当前帖子的作者
        Follow one = followService.getOne(
             new LambdaQueryWrapper<Follow>()
             .eq(Follow::getAuthorId, authorId)
             .eq(Follow::getFollowerId, follower.getId())
        );

        // 若查询结果不为空，则说明已关注
        if (!ObjectUtils.isEmpty(one)) {
            return SysResult.fail("已关注");
        }

        // 若查询结果为空，则说明未为关注，进行 follow 入库操作
        Follow follow = Follow.builder()
                              .authorId(authorId)
                              .followerId(follower.getId())
                              .build();
        followService.save(follow);

        // 返回结果表示关注成功
        return SysResult.success("关注成功");
    }

    /**
     * 取消关注
     * 请求方法: GET
     * 请求URL: http://localhost:8090/api/relationship/unsubscribe/authorId
     * 请求参数: authorId 被关注人 ID
     * 返回值: SysResult("未关注 / 取关成功")
     */
    @GetMapping("/unsubscribe/{authorId}")
    public SysResult unfollow(
        @RequestHeader(value = USERNAME) String username,
        @PathVariable("authorId") String authorId) {
        // 根据请求头中的 username 查询对应的 user
        User user = userService.getUserByUsername(username);

        // 查询当前登录用户与要取关的帖子作者之间是否存在联系
        Follow one = followService.getOne(
            new LambdaQueryWrapper<Follow>()
                .eq(Follow::getAuthorId, authorId)
                .eq(Follow::getFollowerId, user.getId())
        );

        // 若没有联系则返回 "未关注"
        if (ObjectUtils.isEmpty(one)) {
            return SysResult.fail("未关注");
        }

        // 若有联系则根据 authorId 删除 follow 关联表中所有关联信息
        followService.remove(
            new LambdaQueryWrapper<Follow>()
                .eq(Follow::getAuthorId, authorId)
                .eq(Follow::getFollowerId, user.getId())
        );

        // 然后返回 "取关成功"
        return SysResult.success("取关成功");
    }

    /*
     * 判断当前登录用户 与 帖子所属用户之间是否有联系
     * 请求方法: GET
     * 请求URL: http://localhost:8090/api/relationship/validate/authorId
     * 请求参数: authorId 被关注人 ID
     * 返回值: SysResult(responseMap)
     */
    @GetMapping("/validate/{authorId}")
    public SysResult validateHasFollowed(
        @RequestHeader(value = USERNAME) String username,
        @PathVariable("authorId") String authorId) {
        // 通过 JWT 中的 username 获得当前登录用户的信息
        User user = userService.getUserByUsername(username);
        Map<String, Object> responseMap = new HashMap<>(16);
        // 默认没关注
        responseMap.put("hasFollowed", false);
        // 若当前 user 对象不为空
        if (!ObjectUtils.isEmpty(user)) {
            Follow one = followService.getOne(
                new LambdaQueryWrapper<Follow>()
                    .eq(Follow::getAuthorId, authorId)
                    .eq(Follow::getFollowerId, user.getId())
            );

            // 若存在关注关系
            if (!ObjectUtils.isEmpty(one)) {
                // 则设置为已经关注
                responseMap.put("hasFollowed", true);
            }
        }

        return SysResult.success(responseMap);
    }

}
